Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [klasa] Zaawansowany parser bbcode (php5), advanced bbcode parser
wookieb
post
Post #1





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Projekt jest już na githubie pod adresem
https://github.com/wookieb/bbcode

Proszę o dodawanie informacji o bugach właśnie tam.

UPDATE Wersja 1.2
[php bbcode, parser bbcode, advanced bbcode parser]
Chciałbym dziś zaprezentować swój mechanizm parsujący kod bbcode oraz ułatwiający nam kontrolę nad tym czy tagi są prawidłowo używane.
Klasa do pobrania:
https://github.com/wookieb/bbcode/zipball/master

Przykład działania:
http://wookieb.pl/bbcode/test.php

Readme.html w paczce oraz pod adresem http://wookieb.pl/bbcode/readme.html


Licencja
Skrypt wydany na licencji BSD. Dla własnego jak i komercyjnego użytku.

Ustawienia parsera
Ustawienia dla parsera znajdują się teraz w klasie BbCodeSettings. Ciekawsze z ustawień to

Zaufany kod
  1. $settings->trustText = false; // kod niezaufany
  2. $settings->trustText = true; // kod zaufany


Ustawienie kontroluje stopień sprawdzenia danych. Gdy kod bbcode sparsowaliśmy wcześniej to pobieramy jest wersję zaufaną i zapisujemy.
  1. $code = $bbcode->getBbcode();


Przy ponownym odczytaniu kodu, możemy oznaczyć kod jak zaufany. Spowoduje to ominięcie wielu operacji kontroli atrybutów, przez co parsowanie jest szybsze.

Kod
$bbcode = new BbCode();

$text='[b] Bla Bla [i] Hehe';
$bbcode->parse($text, false); // nie chcemy wyniku wiec ustawiamy na false
$code=$bbcode->getBbcode(); // [b] Bla Bla [i] Hehe[/i][/b]

// $code zapisujemy


// po pewnym czasie odczytujemy i parsujemy go jeszcze raz
$bbcode->getSettings()->trustText = true;
echo $bbcode->parse($code);


Dostępność tagów
Możliwe jest włączenie tylko niektórych tagów parsera

Kod
$bbcode = new BbCode();
$text = '[b]Pogrubienie[/b]
[i]Kursywa[/i]';

echo $bbcode->parse($text);
// <b>Pogrubienie</b>
// <i>Kursywa</i>

$bbcode->getSettings()->availableTags = array('b');
echo $bbcode->parse($text);
// <b>Pogrubienie</b>
// Kursywa



Walidacja HTML (kolejności użycia)
Domyślnie parser poprawia kolejność użycia tagów.
np kod
Kod
[b] pogrubienie [i] Kursywa[/b]
[ul]
    [li]Element listy
[/b]
[/i]

Zamieni na

Kod
[b] pogrubienie [i] Kursywa[/i][/b]
[ul]
    [li]Element listy[/li]
[/ul]


Tworzenie zajawek
Parser potrafi tworzyć zajawke o odpowiedniej ilości znaków (ignorując przy tym tagi bbcode).
Wspiera różne kodowania.

Test pod adresem http://wookieb.pl/bbcode/cut_test.php


Rozszerzanie możliwości
Za pomocą tworzenia nowych tagów i dodawania ich specjalnych ustawień można rozszerzyć bbcode o dodatkowe tagi, możliwości.
Szczególnie chciałbym zwrócić uwage na możliwość "przetrzepania" kodu przez funkcje filtrów, dzięki którym możemy tworzyć zaawansowane zależności.
Informacje na temat ustawień dostępne pod linkiem http://wookieb.pl/bbcode/readme.html

ZACHĘCAM DO OCEN, WNOSZENIA WŁASNYCH UWAG A TAKŻE PROPOZYCJI ZMIAN
Mam nadzieję, że przyda się niejednej osobie, która dostrzeże możliwości użycia parsera NIE TYLKO do Bbcode smile.gif i nie tylko.

Update - 2009.05.31
Dodałem tag youtube do paczki.


Inne zmiany:
- poprawiony generowany kod html dla taga IMG
- poprawiona metoda wyszukiwania nazwy taga
- poprawiona szybkość działania
- przeniesienie ustawień do BbCodeSettings
- poprawiona walidacji urli
- dodatkowe zabezpieczenia przed XSS

Ten post edytował wookieb 23.08.2011, 19:46:20
Powód edycji: [wookieb]: [wookieb]: [Spawnm]: update


--------------------
Go to the top of the page
+Quote Post
12 Stron V  « < 5 6 7 8 9 > »   
Start new topic
Odpowiedzi (120 - 139)
wookieb
post
Post #121





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wystarczy dodać katalog z BbCode do include_path snitch.gif


--------------------
Go to the top of the page
+Quote Post
Zajec
post
Post #122





Grupa: Zarejestrowani
Postów: 1 086
Pomógł: 8
Dołączył: 10.12.2003

Ostrzeżenie: (0%)
-----


Cytat(wookieb @ 3.03.2011, 22:11:02 ) *
Wystarczy dodać katalog z BbCode do include_path snitch.gif
Pewnie, tylko wyboraź sobie takie include_path ze wszystkimi projektami.
Kod
.;include/tools/parsers/BbCode/;include/tools/parsers/Wiki/;include/tools/PHPTAL/;include/tools/Sblam/
Ogłupiałbym tongue.gif

Poza tym nie chodzi mi o to, abym ja sobie z tym poradził. Uważam projekt za ciekawy i chciałem, aby każdemu nowemu jego użytkownikowi działało to out-of-box.

Ten post edytował Zajec 8.03.2011, 12:57:59
Go to the top of the page
+Quote Post
gorzat
post
Post #123





Grupa: Zarejestrowani
Postów: 23
Pomógł: 3
Dołączył: 18.03.2011

Ostrzeżenie: (0%)
-----


witam, sciagnalem sobie to, ale nie bardzo wiem jak sie teraz do tego zabrac...
mam sobie strony index.php oraz dodaj.php, na tym samym poziomie folder bbcode.
no i co teraz musze zrobic, zebym w formularzu dodaj.php mogl sobie wpisac tekst i ubrac go w bbcode?
dodaje do plikow
  1. include_once('Bbcode/BbCode.class.php');
  2. $bb=new BbCode();


i co dalej? co mam zrobic, zebym mogl wpisac test i mi sie to w index.php wyswietlilo pogrubione?
poza tym wyskakuje mi blad
Kod
Warning: include_once(Bbcode/Filters/Youtube.php) [function.include-once]: failed to open stream: No such file or directory in E:\wamp\test\templates\bbcode\BbCode.class.php on line 264

Warning: include_once() [function.include]: Failed opening 'Bbcode/Filters/Youtube.php' for inclusion (include_path='.;C:\php5\pear') in E:\wamp\test\templates\bbcode\BbCode.class.php on line 264

w php.ini znalazlem i odznaczylem
Cytat
Windows: "\path1;\path2"
include_path = ".;c:\php\includes;E:\wamp\www\test\Bbcode\"

ale to nic nie dalo ;/ prosze o pomoc
Go to the top of the page
+Quote Post
Avatarus
post
Post #124





Grupa: Zarejestrowani
Postów: 304
Pomógł: 0
Dołączył: 12.12.2006
Skąd: Pszów

Ostrzeżenie: (0%)
-----


a jak zrobić zwykłe prasowanie
Kod
<br />

W smf bbcode i html jest mieszane podczas zapisu.
Dzięki za pomoc


--------------------
Go to the top of the page
+Quote Post
wookieb
post
Post #125





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Musisz wcześniej zamienić "<br />" na znak nowej linii.


--------------------
Go to the top of the page
+Quote Post
mlawnik
post
Post #126





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


A czy jest możliwość parsowania youtube po samym ID?
@gorzat, użyj patcha Zajeca


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wookieb
post
Post #127





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Tak. W tagu podajesz po prostu tylko jego ID


--------------------
Go to the top of the page
+Quote Post
mlawnik
post
Post #128





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


No ale jak podaje samo id to mi sie wyswietla ramka z youtubem i tekstem, ze not found.
Fakt, uzylem patcha zejeca i zmienilem player na nowy.
Mozesz pomoc?

Moj kod:

github.com/marcinlawnik/BBcode-parser


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wookieb
post
Post #129





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jestem kretynem. Mój błąd
W pliku Filter/Youtube.php
zamień linijke
  1. $idMovie = htmlspecialchars($str);

na
  1. $idMovie = htmlspecialchars($bodyStr);

Ja też to potem wrzucę na githuba.


--------------------
Go to the top of the page
+Quote Post
mlawnik
post
Post #130





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Poprawione.

Zaraz dorzuce twoje przyklady i zrobie diff na twoim oryginale i mojej modyfikacji.

Ew. po prostu zrobisz forka z mojej wersji.


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
wookieb
post
Post #131





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Raczej nie forka. I tak będę wydawał nową wersję.


--------------------
Go to the top of the page
+Quote Post
mlawnik
post
Post #132





Grupa: Zarejestrowani
Postów: 455
Pomógł: 49
Dołączył: 12.04.2010

Ostrzeżenie: (0%)
-----


Czekam z nieciepliwością.

EDIT: Dla potomnych:

Zawartosc paczki z pierwszego postu:

GitHub

Paczka z pierwszego postu z modyfikacjami:
- patch zajeca
- poprawka w youtube.php taka sama jak w patchu bo zajec ja pominal
- poprawka 2 posty wyzej z $str i $bodyStr

GitHub



Ten post edytował mlawnik 10.04.2011, 19:46:46


--------------------
Pozdrawiam,
mlawnik

Cytat(nospor)
Jedzmy gówno.... miliony much nie może się przecież mylić
Go to the top of the page
+Quote Post
nekomata
post
Post #133





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

Ostrzeżenie: (0%)
-----


Jedna rzecz , czy parser blokuję html'a i XSS czy to już należy do nas?
Go to the top of the page
+Quote Post
wookieb
post
Post #134





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Sam blokuje.


--------------------
Go to the top of the page
+Quote Post
nekomata
post
Post #135





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

Ostrzeżenie: (0%)
-----


Dzięki , zaoszczędzi mi to trochę włosów na głowie tongue.gif ogólnie świetna sprawa.Myślałeś może o dodaniu tagu "spoiler"?
Go to the top of the page
+Quote Post
wookieb
post
Post #136





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Nie planuje, bo jest to zbyt zależne od widoku.


--------------------
Go to the top of the page
+Quote Post
nekomata
post
Post #137





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

Ostrzeżenie: (0%)
-----


W sumie dzięki takiemu łatwemu do zrozumienia rozpisaniu klasy bardzo łatwo dopisywać tagi. Jakby ktoś chciał tag spoiler z jQuery to ja zrobiłem to tak :
Zaraz po tag'u Quote w pliku Basic.php
  1. ,
  2. 'spoiler'=>array(
  3. 'open'=>'div class="spoiler"><input type="button" value="Spoiler"/><div class="spoiled"',
  4. 'close'=>'div></div'
  5. )
CSS :
  1. .spoiler , .spoiler input {
  2. margin:5px;
  3. border: 1px white dashed;
  4. }
  5. div.spoiler div.spoiled{
  6. display:none;
  7. margin:5px;
  8. }
i w JS
[JAVASCRIPT] pobierz, plaintext
  1. $('.spoiler').children('input').click(function(){
  2. $(this).siblings('.spoiled').toggle();
  3. });
[JAVASCRIPT] pobierz, plaintext
A tak ogólnie mówiąc to ja taki parser bym sprzedawał a nie publikował .. biggrin.gif
EDIT : Pozwoliłem sobie otworzyć tagi spowrotem tongue.gif Ponieważ "domykają" się one w linijce 670,695 i 790 pliku BbCode.class.php tongue.gif

Ten post edytował nekomata 13.04.2011, 19:26:41
Powód edycji: [wookieb]: Pozwoliłem sobie domknąć Ci tagi html
Go to the top of the page
+Quote Post
szczeku
post
Post #138





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 29.08.2010

Ostrzeżenie: (0%)
-----


Cześć,

Na początek napisze, że świetny parser stworzyłeś.

Ale mam dwie kwestie.

1. Zagnieżdzanie tagów, np:

  1. [b]123[/b]

zamienia na:
  1. <b><b>123</b></b>

zamiast na:
  1. <b>123</b>


pomimo iż w filtrze taga 'b' jest :
  1. 'notallowed_child'=>array('b')


inne tagi usuwa, jeśli się je poda jako niedozwolone

2. Chciałbym zrobić tak, żeby nie domykało tagów np. gdy zapomni się napisać [/quote] , to żeby nie robiło cytowania, teraz cytatem jest objęte wszystko do końca. Czy jest jakiś sposób aby tak się działo (a raczej nie działo smile.gif).

pozdrawiam
Go to the top of the page
+Quote Post
nekomata
post
Post #139





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

Ostrzeżenie: (0%)
-----


@mlawnik popraw tag youtube'a dokładnie mam na myśli linijkę 77 , usuń "allowfullscreen" bo w3c validator krzyczy a nic to allowfullscreen niezmienia bo to nie jest embed tylko iframe.
Go to the top of the page
+Quote Post
wookieb
post
Post #140





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




1) Tak zajmę się tym
2) Niestety raczej nie ma takiej opcji ale racja muszę o tym pomyśleć.


--------------------
Go to the top of the page
+Quote Post

12 Stron V  « < 5 6 7 8 9 > » 
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 18:49